掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
一個最典型的場景,如在同一個應(yīng)用(thinkphp5是模塊)下,A控制器有一個a方法,B控制器的b方法跟a方法類似,這時候如果要減少代碼的重復,我們可以直接在b方法中復用a方法的邏輯,最簡單的邏輯,就是把a、b的調(diào)用的邏輯全部寫到公共應(yīng)用或模塊中。但實際上即便所有的邏輯全部寫在A、B控制器中,也可以實現(xiàn)調(diào)用。
在thinkphp5中框架自帶了一個助手函數(shù)action。在b方法中調(diào)用a方法的代碼也很簡單:
return action('A/a',[參數(shù)]);
假設(shè)在home應(yīng)用下,已經(jīng)存在Posts控制器的index方法,需要在Pages控制器的index方法中調(diào)用。且index可以接受參數(shù)name。Posts控制器的示例代碼如下:
namespace app\home\controller; use app\common\controller\HomeBase; class Posts extends HomeBase{ public? function? index($name=''){ return $name; } }
那么控制器Pages的示例代碼如下:
namespace app\home\controller; use app\common\controller\HomeBase; class Pages extends HomeBase{ public? function? index(){ $name='test'; return action('Posts/index',[$name]);//核心代碼① } }
而在thinkphp6中框架取消了助手函數(shù)action,那是不是就不能直接利用框架自帶的工具來完成這樣的需求呢?答案肯定是否定的,實際上thinkphp還有兩個常用的助手函數(shù)可以實現(xiàn)這樣的需求,那就是invoke和app。
1、invoke
invoke用于調(diào)用反射執(zhí)行callable,支持依賴注入,方法代碼如下:
?/** * 調(diào)用反射實例化對象或者執(zhí)行方法 支持依賴注入 * @param mixed $call 類名或者callable * @param array $args 參數(shù) * @return mixed */ function invoke($call, array $args = []) { if (is_callable($call)) { return Container::getInstance()->invoke($call, $args); } return Container::getInstance()->invokeClass($call, $args); }
實現(xiàn)上述需求的示例代碼(把上面示例中的核心代碼①修改)如下:
return invoke(['app\home\controller\Posts','index'],[$name]);
2、app
invoke用于快速獲取容器中的實例,支持依賴注入,方法代碼如下:
/** * 快速獲取容器中的實例 支持依賴注入 * @param string $name 類名或標識 默認獲取當前應(yīng)用實例 * @param array $args 參數(shù) * @param bool $newInstance 是否每次創(chuàng)建新的實例 * @return object|App */ function app(string $name = '', array $args = [], bool $newInstance = false) { return Container::getInstance()->make($name ?: App::class, $args, $newInstance); }
實現(xiàn)上述需求的示例代碼(把上面示例中的核心代碼①修改)如下:
return app('app\home\controller\Posts',[$name])->index();
也可以把參數(shù)放在后面
return app('app\home\controller\Posts')->index($name);
這樣我們就使用invoke或app代替action實現(xiàn)調(diào)用控制器方法,關(guān)于invoke和app助手函數(shù)的具體用法大家可以詳細閱讀thinkphp官方文檔的詳細說明。
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流